package cn.hackcloud.concurrency.lach;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * Created by www.ibfbc.com
 */
public abstract class Latch {
    //用于控制多少个线程完成任务时才能打开阀门
    protected int limit;

    public Latch(int limit) {
        this.limit = limit;
    }

    //该方法会使当前线程一直等待，直到所有线程都完成工作。被阻塞的线程是允许被中断的
    public abstract void await() throws InterruptedException;

    //该方法会使当前线程一直等待，直到所有线程都完成工作。被阻塞的线程是允许被中断的
    public abstract void await(TimeUnit timeUnit, long times) throws InterruptedException, TimeoutException;

    //当任务线程完成后调用该方法使计数器减一
    public abstract void countDown();

    //获取当前还有多少线程没有完成任务
    public abstract int getActive();
}
